package com.zheng.cms.admin.jms;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * MQ消费者
 * Created by ZhangShuzheng on 2017/01/12.
 * 订阅模式？点对点模式？
 *
 *
 * 请使用	DefaultMessageListenerContainer，它允许异步接收消息并缓存session和消息consumer，而且还可以根据消息数量动态的增加或缩减监听器的数量
 *     <bean id="defaultMessageQueueListener" class="com.zheng.cms.admin.jms.DefaultMessageQueueListener"/>
 *     <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
 *
 *
 *   （1）一个是监听接口获取数据（TopicMessageListen）
 *   因为我们在配置文件里面加入了监听，这里只需要实现MessageListener接口就可以了，然后在处理message信息
 *   （2）发送消息（TopicSendMessage）
 *   发送数据的方式基本上大同小异通过获取jmsTemplate来实现发送的操作，因为我没有直接启动容器，所以采用获取bean的方式
 * 　接收上面没有运行，因为接收的这个receive（）方法是同步运行的，会卡线程这里不做演示，我通过启动两个方式测试可以成功的，
 * 	但是不建议这种方式
 */
public class DefaultMessageQueueListener implements MessageListener {

	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMessageQueueListener.class);

	@Autowired
	ThreadPoolTaskExecutor threadPoolTaskExecutor;
	/**监听==================监听(下面是log日志，也在控制台打印了)
	 2018-12-10 17:43:50,501 [threadPoolTaskExecutor-1] INFO  [com.zheng.cms.admin.jms.DefaultMessageQueueListener] - 消费消息：----------------- topicSend ------
	 //消费消息：{}----------------- topicSend ------

	 为什么要用多线程来处理这个监听消息了？

	 */
	@Override
    public void onMessage(final Message message) {
		System.out.println("监听==================监听");
		// 使用线程池多线程处理
		threadPoolTaskExecutor.execute(new Runnable() {
			@Override
            public void run() {
				if (message instanceof TextMessage) {
					TextMessage textMessage = (TextMessage) message;
					try {
						LOGGER.info("消费消息：{}", textMessage.getText());
						//System.out.println("消费消息：{}"+textMessage.getText());
					} catch (Exception e){
						e.printStackTrace();
					}
				}
			}
		});
	}

}
